//
//  GAKKIBaseTableViewController.m
//  GANGAIKit
//
//  Created by fh on 2019/11/6.
//  Copyright © 2019 cashchina. All rights reserved.
//

#import "GAKKIBaseTableViewController.h"

@interface GAKKIBaseTableViewController ()
/// 列表控件
@property (nonatomic, readwrite, strong) UITableView *tableView;
/// 列表控件样式
@property (nonatomic, readwrite, assign) UITableViewStyle tableViewStyle;

/// 自适应头尾高度:如果制定了具体高度就不要使用该方法了
/// @param headerOrFooterView 头部或尾部
- (void)fitTableViewHeightWithView:(UIView*)headerOrFooterView;
@end

@implementation GAKKIBaseTableViewController
#pragma mark - Public
/// 配置子视图:默认添加tableView并设置frame(已适配iPhoneX和iOS11),子类可以重写,重写必须自己添加tableView到父视图并设置frame : 重写父类方法
- (void)setupView {
    [self.view addSubview:self.tableView];
    [self.tableView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.right.equalTo(@(0));
        if ((self.tabBarController || self.navigationController.tabBarController) && !self.hidesBottomBarWhenPushed) {
            make.bottom.equalTo(@(-kApplicationTabBarHeight));
        }else {
            make.bottom.equalTo(@(-kApplicationBottomSpace));
        }
        if ([UINavigationBar appearance].isTranslucent) {
            make.top.equalTo(@(kApplicationTopBarHeight));
        }else {
            make.top.equalTo(@(0));
        }
    }];
}

/// 刷新数据
- (void)reloadData {
    [self.tableView reloadData];
}

#pragma mark - Life
+ (instancetype)new {
    return [super new];
}

/// 初始化:这个方法是每个初始化方法最后都会调用的
- (instancetype)init {
    if (self = [super init]) {
        [self inner_baseTableViewControllerDefaultInitSetup];
    }
    return self;
}

/// 用传递参数初始化
/// @param params 传递参数
- (instancetype)initWithParams:(NSDictionary * __nullable)params {
    return [self initWithStyle:UITableViewStylePlain params:params];
}

/// 初始化控制器
/// @param style 列表控件样式
- (instancetype)initWithStyle:(UITableViewStyle)style {
    return [self initWithStyle:style params:nil];
}

/// 初始化控制器
/// @param style 表格视图样式
/// @param params 参数
- (instancetype)initWithStyle:(UITableViewStyle)style params:(NSDictionary * __nullable)params {
    if (self = [super initWithParams:params]) {
        _tableViewStyle = style;
    }
    return self;
}

- (instancetype)initWithStyle:(UITableViewStyle)style params:(NSDictionary *)params settingBlock:(void (^)(GAKKIBaseTableViewController * _Nonnull))settingBlock {
    if (self = [self initWithStyle:style params:params]) {
        if (settingBlock) {
            settingBlock(self);
        }
    }
    return self;
}

#pragma mark - Event


#pragma mark - Private
/// 初始化默认参数
- (void)inner_baseTableViewControllerDefaultInitSetup {
    _tableViewStyle = UITableViewStylePlain;
    _cellSeparatorStyle = UITableViewCellSeparatorStyleSingleLine;
    _shouldMultiSections = NO;
//    _shouldPullUpToLoadMore = NO;
//    _shouldPullDownToRefresh = NO;
    _shouldFixCellSeparator = NO;
    
    self.nullDataTitleText = @"暂无数据";
    self.nullDataDescriptionText = @"暂无数据";
}

/// 自适应头尾高度:如果制定了具体高度就不要使用该方法了
/// @param headerOrFooterView 头部或尾部
- (void)fitTableViewHeightWithView:(UIView*)headerOrFooterView {
    CGFloat height = [headerOrFooterView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    CGRect frame = headerOrFooterView.bounds;
    frame.size.height = height;
    headerOrFooterView.frame = frame;
}

#pragma mark - UITableViewDataSource
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    GAKKIBaseTableViewCell *cell = [GAKKIBaseTableViewCell dequeueReusableCellWithTable:tableView];
    return cell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.shouldMultiSections) {
        NSMutableArray *realArr = (NSMutableArray *)self.dataSource[section];
        return realArr.count;
    }
    return self.dataSource.count;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    if (self.shouldMultiSections) {
        return self.dataSource ? self.dataSource.count : 1;
    }
    return 1;
}

#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

#pragma mark - Setter and getter
- (UITableView *)tableView {
    if (!_tableView) {
        _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:_tableViewStyle];
        if (@available(iOS 11.0, *)) {
            _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        } else {
            self.automaticallyAdjustsScrollViewInsets = NO;
        }
        _tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
        
        _tableView.dataSource = self;
        _tableView.delegate = self;
        _tableView.estimatedRowHeight = 44;
        _tableView.rowHeight = UITableViewAutomaticDimension;
        
        _tableView.emptyDataSetSource = self;
        _tableView.emptyDataSetDelegate = self;
        
        // 这部分功能迁移到类目GAKKIBaseTableViewController+Refresh里了
//        // 刷新头部
//        GAKKIBaseRefreshHeader *header = [GAKKIBaseRefreshHeader headerWithRefreshingTarget:self refreshingAction:@selector(refreshListHeaderAction:)]; // GAKKIBaseRefreshHeader / MJRefreshNormalHeader
//        _tableView.mj_header = header;
//        _tableView.mj_header.hidden = !_shouldPullDownToRefresh;
//        // 刷新尾部
//        GAKKIBaseRefreshFooter *footer = [GAKKIBaseRefreshFooter footerWithRefreshingTarget:self refreshingAction:@selector(refreshListFooterAction:)]; // GAKKIBaseRefreshFooter / MJRefreshBackStateFooter
//        _tableView.mj_footer = footer;
//        _tableView.mj_footer.hidden = !_shouldPullUpToLoadMore;
        
        //  去除多余的分割线
        _tableView.tableFooterView = [UIView new];
        //  补全UITableViewCell分割线
        if (_shouldFixCellSeparator) {
            if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
                [_tableView setSeparatorInset:UIEdgeInsetsZero];
            }
            if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
                [_tableView setLayoutMargins:UIEdgeInsetsZero];
            }
        }
        _tableView.backgroundColor = [UIColor whiteColor];
    }
    return _tableView;
}

/// 数据源
- (NSMutableArray *)dataSource {
    if (!_dataSource) {
        _dataSource = [NSMutableArray array];
    }
    return _dataSource;
}

///// 分页网络请求参数
//- (NSMutableDictionary *)requestPageInfoDic {
//    if (!self.pageInfoModel) {
//        self.pageInfoModel = [[GAKKIPageInfoModel alloc] init];
//    }
//    _requestPageInfoDic = [NSMutableDictionary dictionary];
//    return _requestPageInfoDic;
//}

/// 是否有数据
- (BOOL)isHadData {
    return self.dataSource.count > 0;
}

///// 是否支持上拉加载
///// @param shouldPullUpToLoadMore 是否支持上拉加载
//- (void)setShouldPullUpToLoadMore:(BOOL)shouldPullUpToLoadMore {
//    _shouldPullUpToLoadMore = shouldPullUpToLoadMore;
//    _tableView.mj_footer.hidden = !shouldPullUpToLoadMore;
//}
//
///// 是否支持下拉刷新
///// @param shouldPullDownToRefresh 是否支持下拉刷新
//- (void)setShouldPullDownToRefresh:(BOOL)shouldPullDownToRefresh {
//    _shouldPullDownToRefresh = shouldPullDownToRefresh;
//    _tableView.mj_header.hidden = !shouldPullDownToRefresh;
//}

/// 是否补齐分割线
/// @param shouldFixCellSeparator 是否补齐分割线
- (void)setShouldFixCellSeparator:(BOOL)shouldFixCellSeparator {
    _shouldFixCellSeparator = shouldFixCellSeparator;
    //  补全UITableViewCell分割线
    if (shouldFixCellSeparator) {
        if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
            [_tableView setSeparatorInset:UIEdgeInsetsZero];
        }
        if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
            [_tableView setLayoutMargins:UIEdgeInsetsZero];
        }
    }else {
        if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
            [_tableView setSeparatorInset:UIEdgeInsetsMake(0, 15, 0, 0)];
        }
        if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
            [_tableView setLayoutMargins:UIEdgeInsetsMake(0, 15, 0, 0)];
        }
    }
}

/// cell分割线样式
/// @param cellSeparatorStyle cell分割线样式
- (void)setCellSeparatorStyle:(UITableViewCellSeparatorStyle)cellSeparatorStyle {
    _cellSeparatorStyle = cellSeparatorStyle;
    self.tableView.separatorStyle = cellSeparatorStyle;
}

/// 分区头是否可用
/// @param sectionHeaderViewAvailable 分区头
- (void)setSectionHeaderViewAvailable:(BOOL)sectionHeaderViewAvailable {
    _sectionHeaderViewAvailable = sectionHeaderViewAvailable;
    self.tableView.estimatedSectionHeaderHeight = sectionHeaderViewAvailable ? 5 : 0;
    self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
}

/// 分区尾是否可用
/// @param sectionFooterViewAvailable 分区尾
- (void)setSectionFooterViewAvailable:(BOOL)sectionFooterViewAvailable {
    _sectionFooterViewAvailable = sectionFooterViewAvailable;
    self.tableView.estimatedSectionFooterHeight = sectionFooterViewAvailable ? 5 : 0;
    self.tableView.sectionFooterHeight = UITableViewAutomaticDimension;
}

@end
